Add gtk_widget_(un)register_window
authorAlexander Larsson <alexl@redhat.com>
Tue, 5 Feb 2013 08:36:49 +0000 (09:36 +0100)
committerAlexander Larsson <alexl@redhat.com>
Thu, 7 Feb 2013 10:11:37 +0000 (11:11 +0100)
This replaces the previously hardcoded calls to gdk_window_set_user_data,
and also lets us track which windows are a part of a widget. Old code
should continue working as is, but new features that require the
windows may not work perfectly.

We need this for the transparent widget support to work, as we need
to specially mark the windows of child widgets.

https://bugzilla.gnome.org/show_bug.cgi?id=687842

42 files changed:
gtk/gtk.symbols
gtk/gtkbutton.c
gtk/gtkcalendar.c
gtk/gtkcolorswatch.c
gtk/gtkdrawingarea.c
gtk/gtkentry.c
gtk/gtkeventbox.c
gtk/gtkexpander.c
gtk/gtkfixed.c
gtk/gtkiconview.c
gtk/gtkinvisible.c
gtk/gtklabel.c
gtk/gtklayout.c
gtk/gtkmenu.c
gtk/gtkmenuitem.c
gtk/gtkmenushell.c
gtk/gtkmisc.c
gtk/gtknotebook.c
gtk/gtkoffscreenwindow.c
gtk/gtkoverlay.c
gtk/gtkpaned.c
gtk/gtkpathbar.c
gtk/gtkplug.c
gtk/gtkrange.c
gtk/gtkscrolledwindow.c
gtk/gtkseparatortoolitem.c
gtk/gtksocket.c
gtk/gtkspinbutton.c
gtk/gtkswitch.c
gtk/gtktexthandle.c
gtk/gtktextview.c
gtk/gtktoolbar.c
gtk/gtktoolitem.c
gtk/gtktoolitemgroup.c
gtk/gtktoolpalette.c
gtk/gtktreeview.c
gtk/gtktreeviewcolumn.c
gtk/gtkviewport.c
gtk/gtkwidget.c
gtk/gtkwidget.h
gtk/gtkwin32embedwidget.c
gtk/gtkwindow.c

index eb10a91487c30c8d7c50e1809267737035178445..9f0d61a8a16a3d7d4cf1014219da6e7e61f25203 100644 (file)
@@ -3839,6 +3839,7 @@ gtk_widget_queue_resize
 gtk_widget_queue_resize_no_redraw
 gtk_widget_realize
 gtk_widget_region_intersect
+gtk_widget_register_window
 gtk_widget_remove_accelerator
 gtk_widget_remove_mnemonic_label
 gtk_widget_render_icon
@@ -3909,6 +3910,7 @@ gtk_widget_trigger_tooltip_query
 gtk_widget_unmap
 gtk_widget_unparent
 gtk_widget_unrealize
+gtk_widget_unregister_window
 gtk_widget_unset_state_flags
 gtk_widget_insert_action_group
 #ifdef GDK_WINDOWING_WIN32
index 824f4986e9a5d98e140c250796aaebdd6653f2a5..3ac36a71b8d37ddeccc5ee2b95a641466345d1eb 100644 (file)
@@ -1420,7 +1420,7 @@ gtk_button_realize (GtkWidget *widget)
 
   priv->event_window = gdk_window_new (window,
                                        &attributes, attributes_mask);
-  gdk_window_set_user_data (priv->event_window, button);
+  gtk_widget_register_window (widget, priv->event_window);
 }
 
 static void
@@ -1434,7 +1434,7 @@ gtk_button_unrealize (GtkWidget *widget)
 
   if (priv->event_window)
     {
-      gdk_window_set_user_data (priv->event_window, NULL);
+      gtk_widget_unregister_window (widget, priv->event_window);
       gdk_window_destroy (priv->event_window);
       priv->event_window = NULL;
     }
index 89d4142881def6dddd54af58a431bfb6f8064ffe..cfceb08a1530698aec9c2ca9606e44b1229d2fd8 100644 (file)
@@ -1593,7 +1593,7 @@ calendar_realize_arrows (GtkCalendar *calendar)
                                                &attributes,
                                                attributes_mask);
 
-          gdk_window_set_user_data (priv->arrow_win[i], widget);
+          gtk_widget_register_window (widget, priv->arrow_win[i]);
         }
       priv->arrow_prelight = 0x0;
     }
@@ -1614,7 +1614,7 @@ calendar_unrealize_arrows (GtkCalendar *calendar)
     {
       if (priv->arrow_win[i])
         {
-          gdk_window_set_user_data (priv->arrow_win[i], NULL);
+          gtk_widget_unregister_window (GTK_WIDGET (calendar), priv->arrow_win[i]);
           gdk_window_destroy (priv->arrow_win[i]);
           priv->arrow_win[i] = NULL;
         }
@@ -1704,7 +1704,7 @@ gtk_calendar_realize (GtkWidget *widget)
 
   priv->main_win = gdk_window_new (gtk_widget_get_window (widget),
                                    &attributes, attributes_mask);
-  gdk_window_set_user_data (priv->main_win, widget);
+  gtk_widget_register_window (widget, priv->main_win);
 
   calendar_realize_arrows (GTK_CALENDAR (widget));
 }
@@ -1718,7 +1718,7 @@ gtk_calendar_unrealize (GtkWidget *widget)
 
   if (priv->main_win)
     {
-      gdk_window_set_user_data (priv->main_win, NULL);
+      gtk_widget_unregister_window (widget, priv->main_win);
       gdk_window_destroy (priv->main_win);
       priv->main_win = NULL;
     }
index f6d662b5eeff35614605fb0d395624029205a670..e33a3f601f137be9d7c9200b0ff40a387416db96 100644 (file)
@@ -628,7 +628,7 @@ swatch_realize (GtkWidget *widget)
   swatch->priv->event_window = 
     gdk_window_new (window,
                     &attributes, attributes_mask);
-  gdk_window_set_user_data (swatch->priv->event_window, widget);
+  gtk_widget_register_window (widget, swatch->priv->event_window);
 }
 
 static void
@@ -638,7 +638,7 @@ swatch_unrealize (GtkWidget *widget)
 
   if (swatch->priv->event_window)
     {
-      gdk_window_set_user_data (swatch->priv->event_window, NULL);
+      gtk_widget_unregister_window (widget, swatch->priv->event_window);
       gdk_window_destroy (swatch->priv->event_window);
       swatch->priv->event_window = NULL;
     }
index 912992bfe8d8b41c2b2b2951ce6054ee04eb661b..60b958f1d6a8f75a61424314bc9e6adac3fb87f7 100644 (file)
@@ -194,7 +194,7 @@ gtk_drawing_area_realize (GtkWidget *widget)
 
       window = gdk_window_new (gtk_widget_get_parent_window (widget),
                                &attributes, attributes_mask);
-      gdk_window_set_user_data (window, darea);
+      gtk_widget_register_window (widget, window);
       gtk_widget_set_window (widget, window);
 
       gtk_style_context_set_background (gtk_widget_get_style_context (widget),
index 184277c01bc39c7eb818320fd268902e9db94bef..d6a3804261a730b342f72749b68e33d55f1e1d44 100644 (file)
@@ -2973,7 +2973,7 @@ realize_icon_info (GtkWidget            *widget,
   icon_info->window = gdk_window_new (gtk_widget_get_window (widget),
                                       &attributes,
                                       attributes_mask);
-  gdk_window_set_user_data (icon_info->window, widget);
+  gtk_widget_register_window (widget, icon_info->window);
 
   gtk_widget_queue_resize (widget);
 }
@@ -3100,7 +3100,7 @@ gtk_entry_realize (GtkWidget *widget)
                                     &attributes,
                                     attributes_mask);
 
-  gdk_window_set_user_data (priv->text_area, entry);
+  gtk_widget_register_window (widget, priv->text_area);
 
   if (attributes_mask & GDK_WA_CURSOR)
     g_object_unref (attributes.cursor);
@@ -3145,7 +3145,7 @@ gtk_entry_unrealize (GtkWidget *widget)
   
   if (priv->text_area)
     {
-      gdk_window_set_user_data (priv->text_area, NULL);
+      gtk_widget_unregister_window (widget, priv->text_area);
       gdk_window_destroy (priv->text_area);
       priv->text_area = NULL;
     }
index 6f0b027da2c2a81e283e4a8ee23b23d91895b0ea..98025be07e55487ad2672e426f630a543d49eb89 100644 (file)
@@ -429,7 +429,7 @@ gtk_event_box_realize (GtkWidget *widget)
       window = gdk_window_new (gtk_widget_get_parent_window (widget),
                                &attributes, attributes_mask);
       gtk_widget_set_window (widget, window);
-      gdk_window_set_user_data (window, widget);
+      gtk_widget_register_window (widget, window);
     }
   else
     {
@@ -448,7 +448,7 @@ gtk_event_box_realize (GtkWidget *widget)
 
       priv->event_window = gdk_window_new (window,
                                            &attributes, attributes_mask);
-      gdk_window_set_user_data (priv->event_window, widget);
+      gtk_widget_register_window (widget, priv->event_window);
     }
 
   if (visible_window)
@@ -462,7 +462,7 @@ gtk_event_box_unrealize (GtkWidget *widget)
 
   if (priv->event_window != NULL)
     {
-      gdk_window_set_user_data (priv->event_window, NULL);
+      gtk_widget_unregister_window (widget, priv->event_window);
       gdk_window_destroy (priv->event_window);
       priv->event_window = NULL;
     }
index d4253e8588ecb1d8a4c7e9b3575ac9ef1be32a1f..6f6a196a6f4da67b286e615180a7d6a203a4dc39 100644 (file)
@@ -577,7 +577,7 @@ gtk_expander_realize (GtkWidget *widget)
 
   priv->event_window = gdk_window_new (gtk_widget_get_parent_window (widget),
                                        &attributes, attributes_mask);
-  gdk_window_set_user_data (priv->event_window, widget);
+  gtk_widget_register_window (widget, priv->event_window);
 }
 
 static void
@@ -587,7 +587,7 @@ gtk_expander_unrealize (GtkWidget *widget)
 
   if (priv->event_window)
     {
-      gdk_window_set_user_data (priv->event_window, NULL);
+      gtk_widget_unregister_window (widget, priv->event_window);
       gdk_window_destroy (priv->event_window);
       priv->event_window = NULL;
     }
index 1d09e0d5726b58dbeecc5b2d5c3b5d54926dd1bc..14c35afc84e18048d95cba46ae9b00afb94cf23c 100644 (file)
@@ -379,7 +379,7 @@ gtk_fixed_realize (GtkWidget *widget)
       window = gdk_window_new (gtk_widget_get_parent_window (widget),
                                &attributes, attributes_mask);
       gtk_widget_set_window (widget, window);
-      gdk_window_set_user_data (window, widget);
+      gtk_widget_register_window (widget, window);
 
       gtk_style_context_set_background (gtk_widget_get_style_context (widget),
                                         window);
index ffbbbba3ca7ddd482e1adb9d8213eb9751f386be..0c6dc038ce354701c740569e7f2b9e35d77f2ef9 100644 (file)
@@ -1301,7 +1301,7 @@ gtk_icon_view_realize (GtkWidget *widget)
   window = gdk_window_new (gtk_widget_get_parent_window (widget),
                            &attributes, attributes_mask);
   gtk_widget_set_window (widget, window);
-  gdk_window_set_user_data (window, widget);
+  gtk_widget_register_window (widget, window);
 
   gtk_widget_get_allocation (widget, &allocation);
 
@@ -1322,7 +1322,7 @@ gtk_icon_view_realize (GtkWidget *widget)
   
   icon_view->priv->bin_window = gdk_window_new (window,
                                                &attributes, attributes_mask);
-  gdk_window_set_user_data (icon_view->priv->bin_window, widget);
+  gtk_widget_register_window (widget, icon_view->priv->bin_window);
 
   context = gtk_widget_get_style_context (widget);
   gtk_style_context_set_background (context, icon_view->priv->bin_window);
@@ -1338,7 +1338,7 @@ gtk_icon_view_unrealize (GtkWidget *widget)
 
   icon_view = GTK_ICON_VIEW (widget);
 
-  gdk_window_set_user_data (icon_view->priv->bin_window, NULL);
+  gtk_widget_unregister_window (widget, icon_view->priv->bin_window);
   gdk_window_destroy (icon_view->priv->bin_window);
   icon_view->priv->bin_window = NULL;
 
index a98b18d5081c124974f49c667d3e3720d13b40d7..27ca2502cbc66b18a5342a035c9d71d80591675d 100644 (file)
@@ -260,7 +260,7 @@ gtk_invisible_realize (GtkWidget *widget)
 
   window = gdk_window_new (parent, &attributes, attributes_mask);
   gtk_widget_set_window (widget, window);
-  gdk_window_set_user_data (window, widget);
+  gtk_widget_register_window (widget, window);
 }
 
 static void
index 942c0937fdf8027643c278252970cd73ded36a6e..bc17554a230aeeee329c64124acc5326400e12c4 100644 (file)
@@ -4982,7 +4982,7 @@ gtk_label_create_window (GtkLabel *label)
 
   priv->select_info->window = gdk_window_new (gtk_widget_get_window (widget),
                                                &attributes, attributes_mask);
-  gdk_window_set_user_data (priv->select_info->window, widget);
+  gtk_widget_register_window (widget, priv->select_info->window);
 
   if (attributes_mask & GDK_WA_CURSOR)
     g_object_unref (attributes.cursor);
@@ -4998,7 +4998,7 @@ gtk_label_destroy_window (GtkLabel *label)
   if (priv->select_info->window == NULL)
     return;
 
-  gdk_window_set_user_data (priv->select_info->window, NULL);
+  gtk_widget_unregister_window (GTK_WIDGET (label), priv->select_info->window);
   gdk_window_destroy (priv->select_info->window);
   priv->select_info->window = NULL;
 }
index 10528bb2cedcb7211161a11d8fb6a340e9bf21a6..73cdb62f2ac50fceb0166ec8a7389c904a01cb83 100644 (file)
@@ -885,7 +885,7 @@ gtk_layout_realize (GtkWidget *widget)
   window = gdk_window_new (gtk_widget_get_parent_window (widget),
                            &attributes, attributes_mask);
   gtk_widget_set_window (widget, window);
-  gdk_window_set_user_data (window, widget);
+  gtk_widget_register_window (widget, window);
 
   gtk_widget_get_allocation (widget, &allocation);
 
@@ -899,7 +899,7 @@ gtk_layout_realize (GtkWidget *widget)
 
   priv->bin_window = gdk_window_new (window,
                                      &attributes, attributes_mask);
-  gdk_window_set_user_data (priv->bin_window, widget);
+  gtk_widget_register_window (widget, priv->bin_window);
   gtk_style_context_set_background (gtk_widget_get_style_context (widget), priv->bin_window);
 
   tmp_list = priv->children;
@@ -958,7 +958,7 @@ gtk_layout_unrealize (GtkWidget *widget)
   GtkLayout *layout = GTK_LAYOUT (widget);
   GtkLayoutPrivate *priv = layout->priv;
 
-  gdk_window_set_user_data (priv->bin_window, NULL);
+  gtk_widget_unregister_window (widget, priv->bin_window);
   gdk_window_destroy (priv->bin_window);
   priv->bin_window = NULL;
 
index 208f95e4aeba0cff704ceb6832d291d0764f8700..79bde09ab0686f4fd643d437724058a47320fe66 100644 (file)
@@ -2551,7 +2551,7 @@ gtk_menu_realize (GtkWidget *widget)
   window = gdk_window_new (gtk_widget_get_parent_window (widget),
                            &attributes, attributes_mask);
   gtk_widget_set_window (widget, window);
-  gdk_window_set_user_data (window, widget);
+  gtk_widget_register_window (widget, window);
 
   get_menu_padding (widget, &padding);
   border_width = gtk_container_get_border_width (GTK_CONTAINER (widget));
@@ -2576,7 +2576,7 @@ gtk_menu_realize (GtkWidget *widget)
 
   priv->view_window = gdk_window_new (window,
                                       &attributes, attributes_mask);
-  gdk_window_set_user_data (priv->view_window, menu);
+  gtk_widget_register_window (widget, priv->view_window);
 
   gtk_widget_get_allocation (widget, &allocation);
 
@@ -2592,7 +2592,7 @@ gtk_menu_realize (GtkWidget *widget)
 
   priv->bin_window = gdk_window_new (priv->view_window,
                                      &attributes, attributes_mask);
-  gdk_window_set_user_data (priv->bin_window, menu);
+  gtk_widget_register_window (widget, priv->bin_window);
 
   children = GTK_MENU_SHELL (menu)->priv->children;
   while (children)
@@ -2648,7 +2648,7 @@ menu_grab_transfer_window_get (GtkMenu *menu)
 
       window = gdk_window_new (gtk_widget_get_root_window (GTK_WIDGET (menu)),
                                &attributes, attributes_mask);
-      gdk_window_set_user_data (window, menu);
+      gtk_widget_register_window (GTK_WIDGET (menu), window);
 
       gdk_window_show (window);
 
@@ -2664,7 +2664,7 @@ menu_grab_transfer_window_destroy (GtkMenu *menu)
   GdkWindow *window = g_object_get_data (G_OBJECT (menu), "gtk-menu-transfer-window");
   if (window)
     {
-      gdk_window_set_user_data (window, NULL);
+      gtk_widget_unregister_window (GTK_WIDGET (menu), window);
       gdk_window_destroy (window);
       g_object_set_data (G_OBJECT (menu), I_("gtk-menu-transfer-window"), NULL);
     }
@@ -2678,11 +2678,11 @@ gtk_menu_unrealize (GtkWidget *widget)
 
   menu_grab_transfer_window_destroy (menu);
 
-  gdk_window_set_user_data (priv->view_window, NULL);
+  gtk_widget_unregister_window (widget, priv->view_window);
   gdk_window_destroy (priv->view_window);
   priv->view_window = NULL;
 
-  gdk_window_set_user_data (priv->bin_window, NULL);
+  gtk_widget_unregister_window (widget, priv->bin_window);
   gdk_window_destroy (priv->bin_window);
   priv->bin_window = NULL;
 
index c3f50e1d72dcd7fa7af63b89ac7696c41d604357..73c2545dcbd32243d399b27eb8f521e8f2e8754e 100644 (file)
@@ -1566,7 +1566,7 @@ gtk_menu_item_realize (GtkWidget *widget)
 
   priv->event_window = gdk_window_new (gtk_widget_get_parent_window (widget),
                                        &attributes, attributes_mask);
-  gdk_window_set_user_data (priv->event_window, widget);
+  gtk_widget_register_window (widget, priv->event_window);
 }
 
 static void
@@ -1575,7 +1575,7 @@ gtk_menu_item_unrealize (GtkWidget *widget)
   GtkMenuItem *menu_item = GTK_MENU_ITEM (widget);
   GtkMenuItemPrivate *priv = menu_item->priv;
 
-  gdk_window_set_user_data (priv->event_window, NULL);
+  gtk_widget_unregister_window (widget, priv->event_window);
   gdk_window_destroy (priv->event_window);
   priv->event_window = NULL;
 
index 30de337df3d60bb9d28c1e6899a33bd6d2ca7e89..ae36459d43f981feae370333b014a5f46b5df0f8 100644 (file)
@@ -649,7 +649,7 @@ gtk_menu_shell_realize (GtkWidget *widget)
   window = gdk_window_new (gtk_widget_get_parent_window (widget),
                            &attributes, attributes_mask);
   gtk_widget_set_window (widget, window);
-  gdk_window_set_user_data (window, widget);
+  gtk_widget_register_window (widget, window);
 
   context = gtk_widget_get_style_context (widget);
   gtk_style_context_set_background (context, window);
index bb5b3f34c9be3145734b12231cf370b00a123f4e..4bd162ccda0b4b5b3e538ffd33f6f406fe31ed51 100644 (file)
@@ -397,7 +397,7 @@ gtk_misc_realize (GtkWidget *widget)
 
       window = gdk_window_new (gtk_widget_get_parent_window (widget), &attributes, attributes_mask);
       gtk_widget_set_window (widget, window);
-      gdk_window_set_user_data (window, widget);
+      gtk_widget_register_window (widget, window);
       gdk_window_set_background_pattern (window, NULL);
     }
 }
index 377dc906b92093416aa81bfcbfff00ffc36f94ff..5f0ce009a8a72123c2ff8dc185c1e7b4c492a163 100644 (file)
@@ -1908,7 +1908,7 @@ gtk_notebook_realize (GtkWidget *widget)
 
   priv->event_window = gdk_window_new (gtk_widget_get_parent_window (widget),
                                            &attributes, attributes_mask);
-  gdk_window_set_user_data (priv->event_window, notebook);
+  gtk_widget_register_window (widget, priv->event_window);
 }
 
 static void
@@ -1917,13 +1917,13 @@ gtk_notebook_unrealize (GtkWidget *widget)
   GtkNotebook *notebook = GTK_NOTEBOOK (widget);
   GtkNotebookPrivate *priv = notebook->priv;
 
-  gdk_window_set_user_data (priv->event_window, NULL);
+  gtk_widget_unregister_window (widget, priv->event_window);
   gdk_window_destroy (priv->event_window);
   priv->event_window = NULL;
 
   if (priv->drag_window)
     {
-      gdk_window_set_user_data (priv->drag_window, NULL);
+      gtk_widget_unregister_window (widget, priv->drag_window);
       gdk_window_destroy (priv->drag_window);
       priv->drag_window = NULL;
     }
@@ -3126,7 +3126,7 @@ show_drag_window (GtkNotebook        *notebook,
       priv->drag_window = gdk_window_new (gtk_widget_get_parent_window (widget),
                                           &attributes,
                                           attributes_mask);
-      gdk_window_set_user_data (priv->drag_window, widget);
+      gtk_widget_register_window (widget, priv->drag_window);
       gdk_window_set_background_rgba (priv->drag_window, &transparent);
     }
 
index e5a33cca40ad9fd6d483e2f2dbe8a44924bc6bca..8e9f23f02ce997649891ec1aa933c16e88b80851 100644 (file)
@@ -183,7 +183,7 @@ gtk_offscreen_window_realize (GtkWidget *widget)
   window = gdk_window_new (gtk_widget_get_parent_window (widget),
                            &attributes, attributes_mask);
   gtk_widget_set_window (widget, window);
-  gdk_window_set_user_data (window, widget);
+  gtk_widget_register_window (widget, window);
 
   child = gtk_bin_get_child (bin);
   if (child)
index a66ede8dc67cba6622b01f628f03528b35763a00..de80637d071cf811365fc122ada5c42033eaae26 100644 (file)
@@ -105,7 +105,7 @@ gtk_overlay_create_child_window (GtkOverlay *overlay,
 
   window = gdk_window_new (gtk_widget_get_window (widget),
                            &attributes, attributes_mask);
-  gdk_window_set_user_data (window, overlay);
+  gtk_widget_register_window (widget, window);
   gtk_style_context_set_background (gtk_widget_get_style_context (widget), window);
 
   gtk_widget_set_parent_window (child, window);
@@ -443,7 +443,7 @@ gtk_overlay_unrealize (GtkWidget *widget)
       child = children->data;
 
       gtk_widget_set_parent_window (child->widget, NULL);
-      gdk_window_set_user_data (child->window, NULL);
+      gtk_widget_unregister_window (widget, child->window);
       gdk_window_destroy (child->window);
       child->window = NULL;
     }
@@ -539,7 +539,7 @@ gtk_overlay_remove (GtkContainer *container,
         {
           if (child->window != NULL)
             {
-              gdk_window_set_user_data (child->window, NULL);
+              gtk_widget_unregister_window (GTK_WIDGET (container), child->window);
               gdk_window_destroy (child->window);
             }
 
index 5b374b2dfd31e5d32cbf09850b1fabb7ff608332..7c5ec381f3f0ab9eb0633692b53f4ce2009445dc 100644 (file)
@@ -1320,7 +1320,7 @@ gtk_paned_create_child_window (GtkPaned  *paned,
 
   window = gdk_window_new (gtk_widget_get_window (widget),
                            &attributes, attributes_mask);
-  gdk_window_set_user_data (window, paned);
+  gtk_widget_register_window (widget, window);
   gtk_style_context_set_background (gtk_widget_get_style_context (widget), window);
 
   if (child)
@@ -1366,7 +1366,7 @@ gtk_paned_realize (GtkWidget *widget)
 
   priv->handle = gdk_window_new (window,
                                  &attributes, attributes_mask);
-  gdk_window_set_user_data (priv->handle, paned);
+  gtk_widget_register_window (widget, priv->handle);
   if (attributes_mask & GDK_WA_CURSOR)
     g_object_unref (attributes.cursor);
 
@@ -1382,19 +1382,19 @@ gtk_paned_unrealize (GtkWidget *widget)
 
   if (priv->child2)
     gtk_widget_set_parent_window (priv->child2, NULL);
-  gdk_window_set_user_data (priv->child2_window, NULL);
+  gtk_widget_unregister_window (widget, priv->child2_window);
   gdk_window_destroy (priv->child2_window);
   priv->child2_window = NULL;
 
   if (priv->child1)
     gtk_widget_set_parent_window (priv->child1, NULL);
-  gdk_window_set_user_data (priv->child1_window, NULL);
+  gtk_widget_unregister_window (widget, priv->child1_window);
   gdk_window_destroy (priv->child1_window);
   priv->child1_window = NULL;
 
   if (priv->handle)
     {
-      gdk_window_set_user_data (priv->handle, NULL);
+      gtk_widget_unregister_window (widget, priv->handle);
       gdk_window_destroy (priv->handle);
       priv->handle = NULL;
     }
index aec2b0a6b52fdd576e9e0f3f31092a0e0b0a6f41..03ac4c9479728bde5d6c8751115fdfdf16fce991 100644 (file)
@@ -472,7 +472,7 @@ gtk_path_bar_realize (GtkWidget *widget)
 
   path_bar->event_window = gdk_window_new (gtk_widget_get_parent_window (widget),
                                            &attributes, attributes_mask);
-  gdk_window_set_user_data (path_bar->event_window, widget);
+  gtk_widget_register_window (widget, path_bar->event_window);
 }
 
 static void
@@ -482,7 +482,7 @@ gtk_path_bar_unrealize (GtkWidget *widget)
 
   path_bar = GTK_PATH_BAR (widget);
 
-  gdk_window_set_user_data (path_bar->event_window, NULL);
+  gtk_widget_unregister_window (widget, path_bar->event_window);
   gdk_window_destroy (path_bar->event_window);
   path_bar->event_window = NULL;
 
index 9c019dd40850f51b402abd24dd3d29d967bedbec..65df93699b562d34bb90e26cf7b86f8f4afaf8c0 100644 (file)
@@ -677,7 +677,7 @@ gtk_plug_unrealize (GtkWidget *widget)
 
   if (priv->socket_window != NULL)
     {
-      gdk_window_set_user_data (priv->socket_window, NULL);
+      gtk_widget_unregister_window (widget, priv->socket_window);
       g_object_unref (priv->socket_window);
       priv->socket_window = NULL;
 
@@ -879,7 +879,7 @@ gtk_plug_filter_func (GdkXEvent *gdk_xevent,
              {
                GtkWidget *widget = GTK_WIDGET (plug);
 
-                gdk_window_set_user_data (priv->socket_window, NULL);
+                gtk_widget_unregister_window (widget, priv->socket_window);
                g_object_unref (priv->socket_window);
                priv->socket_window = NULL;
 
@@ -1088,7 +1088,7 @@ gtk_plug_realize (GtkWidget *widget)
       gtk_widget_set_window (widget, gdk_window);
     }
 
-  gdk_window_set_user_data (gdk_window, window);
+  gtk_widget_register_window (widget, gdk_window);
 
   gtk_style_context_set_background (gtk_widget_get_style_context (widget),
                                     gdk_window);
index 775503a69a25d4925d6a85f00c03c70e8ff40926..d627566aead86ec21ffb1a782bb06a025ea7b31a 100644 (file)
@@ -1738,7 +1738,7 @@ gtk_range_realize (GtkWidget *widget)
 
   priv->event_window = gdk_window_new (gtk_widget_get_parent_window (widget),
                                        &attributes, attributes_mask);
-  gdk_window_set_user_data (priv->event_window, range);
+  gtk_widget_register_window (widget, priv->event_window);
 }
 
 static void
@@ -1749,7 +1749,7 @@ gtk_range_unrealize (GtkWidget *widget)
 
   gtk_range_remove_step_timer (range);
 
-  gdk_window_set_user_data (priv->event_window, NULL);
+  gtk_widget_unregister_window (widget, priv->event_window);
   gdk_window_destroy (priv->event_window);
   priv->event_window = NULL;
 
index a5dd811a192a2394a359700064ae1b81d4ce3693..0095072ea606ec8404c90afdb1dc1df2b980adab 100644 (file)
@@ -3392,7 +3392,7 @@ gtk_scrolled_window_realize (GtkWidget *widget)
   scrolled_window->priv->overshoot_window =
     gdk_window_new (gtk_widget_get_parent_window (widget),
                     &attributes, attributes_mask);
-  gdk_window_set_user_data (scrolled_window->priv->overshoot_window, widget);
+  gtk_widget_register_window (widget, scrolled_window->priv->overshoot_window);
 
   child_widget = gtk_bin_get_child (GTK_BIN (widget));
 
@@ -3408,7 +3408,7 @@ gtk_scrolled_window_unrealize (GtkWidget *widget)
 {
   GtkScrolledWindow *scrolled_window = GTK_SCROLLED_WINDOW (widget);
 
-  gdk_window_set_user_data (scrolled_window->priv->overshoot_window, NULL);
+  gtk_widget_unregister_window (widget, scrolled_window->priv->overshoot_window);
   gdk_window_destroy (scrolled_window->priv->overshoot_window);
   scrolled_window->priv->overshoot_window = NULL;
 
index 5df1199290e175553da9192eb4ab3fd5f165b912..33a003a8ef878ec11b98689969b6d4911747e1c9 100644 (file)
@@ -304,7 +304,7 @@ gtk_separator_tool_item_realize (GtkWidget *widget)
 
   priv->event_window = gdk_window_new (gtk_widget_get_parent_window (widget),
                                        &attributes, attributes_mask);
-  gdk_window_set_user_data (priv->event_window, widget);
+  gtk_widget_register_window (widget, priv->event_window);
 }
 
 static void
@@ -315,7 +315,7 @@ gtk_separator_tool_item_unrealize (GtkWidget *widget)
 
   if (priv->event_window)
     {
-      gdk_window_set_user_data (priv->event_window, NULL);
+      gtk_widget_unregister_window (widget, priv->event_window);
       gdk_window_destroy (priv->event_window);
       priv->event_window = NULL;
     }
index c7876364506ad61d7fd15595c6d18192cd7eefe5..fc893b80c2ac0ca8e4cc187fe6577683c21b1bbc 100644 (file)
@@ -404,7 +404,7 @@ gtk_socket_realize (GtkWidget *widget)
   window = gdk_window_new (gtk_widget_get_parent_window (widget),
                            &attributes, attributes_mask);
   gtk_widget_set_window (widget, window);
-  gdk_window_set_user_data (window, socket);
+  gtk_widget_register_window (widget, window);
 
   gtk_style_context_set_background (gtk_widget_get_style_context (widget),
                                     window);
index bc1e4a8224f0a46935a9af7965fb3060a99fda72..c20a69f277ee0945f3af486af54b34a553f4c2d8 100644 (file)
@@ -1034,7 +1034,7 @@ gtk_spin_button_realize (GtkWidget *widget)
 
   priv->down_panel = gdk_window_new (gtk_widget_get_window (widget),
                                      &attributes, attributes_mask);
-  gdk_window_set_user_data (priv->down_panel, widget);
+  gtk_widget_register_window (widget, priv->down_panel);
 
   /* create the right panel window */
   attributes.x = up_allocation.x;
@@ -1044,7 +1044,7 @@ gtk_spin_button_realize (GtkWidget *widget)
 
   priv->up_panel = gdk_window_new (gtk_widget_get_window (widget),
                                       &attributes, attributes_mask);
-  gdk_window_set_user_data (priv->up_panel, widget);
+  gtk_widget_register_window (widget, priv->up_panel);
 
   return_val = FALSE;
   g_signal_emit (spin_button, spinbutton_signals[OUTPUT], 0, &return_val);
@@ -1064,14 +1064,14 @@ gtk_spin_button_unrealize (GtkWidget *widget)
 
   if (priv->down_panel)
     {
-      gdk_window_set_user_data (priv->down_panel, NULL);
+      gtk_widget_unregister_window (widget, priv->down_panel);
       gdk_window_destroy (priv->down_panel);
       priv->down_panel = NULL;
     }
 
   if (priv->up_panel)
     {
-      gdk_window_set_user_data (priv->up_panel, NULL);
+      gtk_widget_unregister_window (widget, priv->up_panel);
       gdk_window_destroy (priv->up_panel);
       priv->up_panel = NULL;
     }
index d2e575d471e19861d4f385c9cfd70e9312dabf45..dfcfedc4bd351664ebbe959f2ceb984646212547 100644 (file)
@@ -458,7 +458,7 @@ gtk_switch_realize (GtkWidget *widget)
   priv->event_window = gdk_window_new (parent_window,
                                        &attributes,
                                        attributes_mask);
-  gdk_window_set_user_data (priv->event_window, widget);
+  gtk_widget_register_window (widget, priv->event_window);
 }
 
 static void
@@ -468,7 +468,7 @@ gtk_switch_unrealize (GtkWidget *widget)
 
   if (priv->event_window != NULL)
     {
-      gdk_window_set_user_data (priv->event_window, NULL);
+      gtk_widget_unregister_window (widget, priv->event_window);
       gdk_window_destroy (priv->event_window);
       priv->event_window = NULL;
     }
index 6c7033b28a3f5407b0221374f3a0f1c482dcfecd..871b3ac73e783d718a14b014fa3073a7908caa84 100644 (file)
@@ -197,7 +197,7 @@ _gtk_text_handle_create_window (GtkTextHandle         *handle,
 
   window = gdk_window_new (gtk_widget_get_root_window (priv->parent),
                           &attributes, mask);
-  gdk_window_set_user_data (window, priv->parent);
+  gtk_widget_register_window (priv->parent, window);
   gdk_window_set_background_rgba (window, &bg);
 
   _gtk_text_handle_update_shape (handle, window, pos);
@@ -304,6 +304,7 @@ _gtk_text_handle_update_window (GtkTextHandle         *handle,
                                   width / 2, 0, &x, &y);
     }
 
+  gtk_widget_unregister_window (priv->parent, handle_window->window);
   gdk_window_destroy (handle_window->window);
 
   /* Create new window and apply old state */
index 2fe292ca9655fcb5fab0f54bb04ef9af5da74bba..5845aae439478a168fd191bf0acf82a63b0bdefc 100644 (file)
@@ -4094,7 +4094,7 @@ gtk_text_view_realize (GtkWidget *widget)
   window = gdk_window_new (gtk_widget_get_parent_window (widget),
                            &attributes, attributes_mask);
   gtk_widget_set_window (widget, window);
-  gdk_window_set_user_data (window, widget);
+  gtk_widget_register_window (widget, window);
 
   context = gtk_widget_get_style_context (widget);
 
@@ -8748,7 +8748,7 @@ text_window_realize (GtkTextWindow *win,
                                 &attributes, attributes_mask);
 
   gdk_window_show (win->window);
-  gdk_window_set_user_data (win->window, win->widget);
+  gtk_widget_register_window (win->widget, win->window);
   gdk_window_lower (win->window);
 
   attributes.x = 0;
@@ -8770,7 +8770,7 @@ text_window_realize (GtkTextWindow *win,
                                     attributes_mask);
 
   gdk_window_show (win->bin_window);
-  gdk_window_set_user_data (win->bin_window, win->widget);
+  gtk_widget_register_window (win->widget, win->bin_window);
 
   context = gtk_widget_get_style_context (widget);
   state = gtk_widget_get_state_flags (widget);
@@ -8821,8 +8821,8 @@ text_window_unrealize (GtkTextWindow *win)
                                         NULL);
     }
 
-  gdk_window_set_user_data (win->window, NULL);
-  gdk_window_set_user_data (win->bin_window, NULL);
+  gtk_widget_unregister_window (win->widget, win->window);
+  gtk_widget_unregister_window (win->widget, win->bin_window);
   gdk_window_destroy (win->bin_window);
   gdk_window_destroy (win->window);
   win->window = NULL;
index 5caeb0d4e20d918f2af769a1bd8de2c1ff3ed6d1..0ca1b7eea4d93f3b69ac0becfc1ba977888e163e 100644 (file)
@@ -844,7 +844,7 @@ gtk_toolbar_realize (GtkWidget *widget)
 
   priv->event_window = gdk_window_new (gtk_widget_get_parent_window (widget),
                                       &attributes, attributes_mask);
-  gdk_window_set_user_data (priv->event_window, toolbar);
+  gtk_widget_register_window (widget, priv->event_window);
 }
 
 static void
@@ -855,7 +855,7 @@ gtk_toolbar_unrealize (GtkWidget *widget)
 
   if (priv->event_window)
     {
-      gdk_window_set_user_data (priv->event_window, NULL);
+      gtk_widget_unregister_window (widget, priv->event_window);
       gdk_window_destroy (priv->event_window);
       priv->event_window = NULL;
     }
index 26ad1402f7c4b1904edd725086c919c321a26b2d..167175371028575ebc68414b587ac0b43674fe29 100644 (file)
@@ -432,7 +432,7 @@ create_drag_window (GtkToolItem *toolitem)
 
   toolitem->priv->drag_window = gdk_window_new (gtk_widget_get_parent_window (widget),
                                          &attributes, attributes_mask);
-  gdk_window_set_user_data (toolitem->priv->drag_window, toolitem);
+  gtk_widget_register_window (widget, toolitem->priv->drag_window);
 }
 
 static void
@@ -457,7 +457,7 @@ destroy_drag_window (GtkToolItem *toolitem)
 {
   if (toolitem->priv->drag_window)
     {
-      gdk_window_set_user_data (toolitem->priv->drag_window, NULL);
+      gtk_widget_unregister_window (GTK_WIDGET (toolitem), toolitem->priv->drag_window);
       gdk_window_destroy (toolitem->priv->drag_window);
       toolitem->priv->drag_window = NULL;
     }
index 5907bf4aa7cddb5a55d6636b8a8075e68271b5aa..d6aa8258c6bdcc9371231fb29f75f081dfc744e5 100644 (file)
@@ -1241,7 +1241,7 @@ gtk_tool_item_group_realize (GtkWidget *widget)
                            &attributes, attributes_mask);
   gtk_widget_set_window (widget, window);
 
-  gdk_window_set_user_data (window, widget);
+  gtk_widget_register_window (widget, window);
 
   gtk_style_context_set_background (context, window);
 
index 688688c0d2ca9e2433049b2ae6856eb445b9e6fb..8c77ec1b58a9a4de8e1fc9a398a49e4498f9b66d 100644 (file)
@@ -733,7 +733,7 @@ gtk_tool_palette_realize (GtkWidget *widget)
   window = gdk_window_new (gtk_widget_get_parent_window (widget),
                            &attributes, attributes_mask);
   gtk_widget_set_window (widget, window);
-  gdk_window_set_user_data (window, widget);
+  gtk_widget_register_window (widget, window);
 
   gtk_style_context_set_background (gtk_widget_get_style_context (widget),
                                     window);
index 6da71f1183be6d50f8dfa5aebeae360425ad2426..34898aba622c8cc8c5910a59089dcf1792742104 100644 (file)
@@ -2247,7 +2247,7 @@ gtk_tree_view_realize (GtkWidget *widget)
   window = gdk_window_new (gtk_widget_get_parent_window (widget),
                            &attributes, attributes_mask);
   gtk_widget_set_window (widget, window);
-  gdk_window_set_user_data (window, widget);
+  gtk_widget_register_window (widget, window);
 
   gtk_widget_get_allocation (widget, &allocation);
 
@@ -2268,7 +2268,7 @@ gtk_tree_view_realize (GtkWidget *widget)
 
   tree_view->priv->bin_window = gdk_window_new (window,
                                                &attributes, attributes_mask);
-  gdk_window_set_user_data (tree_view->priv->bin_window, widget);
+  gtk_widget_register_window (widget, tree_view->priv->bin_window);
 
   gtk_widget_get_allocation (widget, &allocation);
 
@@ -2289,7 +2289,7 @@ gtk_tree_view_realize (GtkWidget *widget)
 
   tree_view->priv->header_window = gdk_window_new (window,
                                                   &attributes, attributes_mask);
-  gdk_window_set_user_data (tree_view->priv->header_window, widget);
+  gtk_widget_register_window (widget, tree_view->priv->header_window);
 
   gtk_tree_view_ensure_background (tree_view);
 
@@ -2364,24 +2364,24 @@ gtk_tree_view_unrealize (GtkWidget *widget)
   for (list = priv->columns; list; list = list->next)
     _gtk_tree_view_column_unrealize_button (GTK_TREE_VIEW_COLUMN (list->data));
 
-  gdk_window_set_user_data (priv->bin_window, NULL);
+  gtk_widget_unregister_window (widget, priv->bin_window);
   gdk_window_destroy (priv->bin_window);
   priv->bin_window = NULL;
 
-  gdk_window_set_user_data (priv->header_window, NULL);
+  gtk_widget_unregister_window (widget, priv->header_window);
   gdk_window_destroy (priv->header_window);
   priv->header_window = NULL;
 
   if (priv->drag_window)
     {
-      gdk_window_set_user_data (priv->drag_window, NULL);
+      gtk_widget_unregister_window (widget, priv->drag_window);
       gdk_window_destroy (priv->drag_window);
       priv->drag_window = NULL;
     }
 
   if (priv->drag_highlight_window)
     {
-      gdk_window_set_user_data (priv->drag_highlight_window, NULL);
+      gtk_widget_unregister_window (widget, priv->drag_highlight_window);
       gdk_window_destroy (priv->drag_highlight_window);
       priv->drag_highlight_window = NULL;
     }
@@ -3807,8 +3807,7 @@ gtk_tree_view_motion_draw_column_motion_arrow (GtkTreeView *tree_view)
 
          if (tree_view->priv->drag_highlight_window)
            {
-             gdk_window_set_user_data (tree_view->priv->drag_highlight_window,
-                                       NULL);
+             gtk_widget_unregister_window (GTK_WIDGET (tree_view), tree_view->priv->drag_highlight_window);
              gdk_window_destroy (tree_view->priv->drag_highlight_window);
            }
 
@@ -3824,7 +3823,7 @@ gtk_tree_view_motion_draw_column_motion_arrow (GtkTreeView *tree_view)
          attributes.event_mask = GDK_VISIBILITY_NOTIFY_MASK | GDK_EXPOSURE_MASK | GDK_POINTER_MOTION_MASK;
          attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL;
          tree_view->priv->drag_highlight_window = gdk_window_new (tree_view->priv->header_window, &attributes, attributes_mask);
-         gdk_window_set_user_data (tree_view->priv->drag_highlight_window, GTK_WIDGET (tree_view));
+         gtk_widget_register_window (GTK_WIDGET (tree_view), tree_view->priv->drag_highlight_window);
 
          mask_image = cairo_image_surface_create (CAIRO_FORMAT_A1, width, height);
           cr = cairo_create (mask_image);
@@ -3874,8 +3873,7 @@ gtk_tree_view_motion_draw_column_motion_arrow (GtkTreeView *tree_view)
        {
          if (tree_view->priv->drag_highlight_window)
            {
-             gdk_window_set_user_data (tree_view->priv->drag_highlight_window,
-                                       NULL);
+             gtk_widget_unregister_window (GTK_WIDGET (tree_view), tree_view->priv->drag_highlight_window);
              gdk_window_destroy (tree_view->priv->drag_highlight_window);
            }
 
@@ -3890,7 +3888,7 @@ gtk_tree_view_motion_draw_column_motion_arrow (GtkTreeView *tree_view)
          attributes.height = height;
          tree_view->priv->drag_highlight_window = gdk_window_new (gtk_widget_get_root_window (widget),
                                                                   &attributes, attributes_mask);
-         gdk_window_set_user_data (tree_view->priv->drag_highlight_window, GTK_WIDGET (tree_view));
+         gtk_widget_register_window (GTK_WIDGET (tree_view), tree_view->priv->drag_highlight_window);
 
          mask_image = cairo_image_surface_create (CAIRO_FORMAT_A1, width, height);
 
@@ -3956,8 +3954,7 @@ gtk_tree_view_motion_draw_column_motion_arrow (GtkTreeView *tree_view)
        {
          if (tree_view->priv->drag_highlight_window)
            {
-             gdk_window_set_user_data (tree_view->priv->drag_highlight_window,
-                                       NULL);
+             gtk_widget_unregister_window (GTK_WIDGET (tree_view), tree_view->priv->drag_highlight_window);
              gdk_window_destroy (tree_view->priv->drag_highlight_window);
            }
 
@@ -3971,7 +3968,7 @@ gtk_tree_view_motion_draw_column_motion_arrow (GtkTreeView *tree_view)
          attributes.width = width;
          attributes.height = height;
          tree_view->priv->drag_highlight_window = gdk_window_new (gtk_widget_get_root_window (widget), &attributes, attributes_mask);
-         gdk_window_set_user_data (tree_view->priv->drag_highlight_window, GTK_WIDGET (tree_view));
+         gtk_widget_register_window (GTK_WIDGET (tree_view), tree_view->priv->drag_highlight_window);
 
          mask_image = cairo_image_surface_create (CAIRO_FORMAT_A1, width, height);
 
@@ -9815,7 +9812,7 @@ _gtk_tree_view_column_start_drag (GtkTreeView       *tree_view,
   tree_view->priv->drag_window = gdk_window_new (tree_view->priv->header_window,
                                                  &attributes,
                                                  attributes_mask);
-  gdk_window_set_user_data (tree_view->priv->drag_window, GTK_WIDGET (tree_view));
+  gtk_widget_register_window (GTK_WIDGET (tree_view), tree_view->priv->drag_window);
 
   if (gdk_device_get_source (device) == GDK_SOURCE_KEYBOARD)
     {
index ab2d21db5453236e9c14d42634a11d44f23042d4..af2317cab7250bf3d0be3599a948e339ffad828c 100644 (file)
@@ -1400,7 +1400,7 @@ _gtk_tree_view_column_realize_button (GtkTreeViewColumn *column)
   attr.x       = (allocation.x + (rtl ? 0 : allocation.width)) - TREE_VIEW_DRAG_WIDTH / 2;
   priv->window = gdk_window_new (_gtk_tree_view_get_header_window (tree_view),
                                 &attr, attributes_mask);
-  gdk_window_set_user_data (priv->window, tree_view);
+  gtk_widget_register_window (GTK_WIDGET (tree_view), priv->window);
 
   gtk_tree_view_column_update_button (column);
 
@@ -1417,7 +1417,7 @@ _gtk_tree_view_column_unrealize_button (GtkTreeViewColumn *column)
   priv = column->priv;
   g_return_if_fail (priv->window != NULL);
 
-  gdk_window_set_user_data (priv->window, NULL);
+  gtk_widget_unregister_window (GTK_WIDGET (priv->tree_view), priv->window);
   gdk_window_destroy (priv->window);
   priv->window = NULL;
 }
index e82d70baee0a1cd35b5454b29c7fc7ad02631154..935bda7b9ee91383bae217a8fadbdd0517c95e80 100644 (file)
@@ -689,7 +689,7 @@ gtk_viewport_realize (GtkWidget *widget)
   window = gdk_window_new (gtk_widget_get_parent_window (widget),
                            &attributes, attributes_mask);
   gtk_widget_set_window (widget, window);
-  gdk_window_set_user_data (window, viewport);
+  gtk_widget_register_window (widget, window);
 
   viewport_get_view_allocation (viewport, &view_allocation);
   
@@ -701,7 +701,7 @@ gtk_viewport_realize (GtkWidget *widget)
 
   priv->view_window = gdk_window_new (window,
                                       &attributes, attributes_mask);
-  gdk_window_set_user_data (priv->view_window, viewport);
+  gtk_widget_register_window (widget, priv->view_window);
 
   attributes.x = - gtk_adjustment_get_value (hadjustment);
   attributes.y = - gtk_adjustment_get_value (vadjustment);
@@ -711,7 +711,7 @@ gtk_viewport_realize (GtkWidget *widget)
   attributes.event_mask = event_mask;
 
   priv->bin_window = gdk_window_new (priv->view_window, &attributes, attributes_mask);
-  gdk_window_set_user_data (priv->bin_window, viewport);
+  gtk_widget_register_window (widget, priv->bin_window);
 
   child = gtk_bin_get_child (bin);
   if (child)
@@ -731,11 +731,11 @@ gtk_viewport_unrealize (GtkWidget *widget)
   GtkViewport *viewport = GTK_VIEWPORT (widget);
   GtkViewportPrivate *priv = viewport->priv;
 
-  gdk_window_set_user_data (priv->view_window, NULL);
+  gtk_widget_unregister_window (widget, priv->view_window);
   gdk_window_destroy (priv->view_window);
   priv->view_window = NULL;
 
-  gdk_window_set_user_data (priv->bin_window, NULL);
+  gtk_widget_unregister_window (widget, priv->bin_window);
   gdk_window_destroy (priv->bin_window);
   priv->bin_window = NULL;
 
index 2f4da17b2e86f1fbe37042deaf8adaa96b6ed1b5..2118c43d9479f859624ded1101bdc7ac4c625a63 100644 (file)
@@ -395,6 +395,7 @@ struct _GtkWidgetPrivate
    * GTK_NO_WINDOW flag being set).
    */
   GdkWindow *window;
+  GList *registered_windows;
 
   /* The widget's parent */
   GtkWidget *parent;
@@ -10536,7 +10537,7 @@ gtk_widget_real_unrealize (GtkWidget *widget)
 
   if (gtk_widget_get_has_window (widget))
     {
-      gdk_window_set_user_data (priv->window, NULL);
+      gtk_widget_unregister_window (widget, priv->window);
       gdk_window_destroy (priv->window);
       priv->window = NULL;
     }
@@ -13637,6 +13638,70 @@ gtk_widget_set_window (GtkWidget *widget,
     }
 }
 
+/**
+ * gtk_widget_register_window:
+ * @widget: a #GtkWidget
+ * @window: a #GdkWindow
+ *
+ * Registers a #GdkWindow with the widget and sets it up so that
+ * the widget recieves events for it. Call gtk_widget_unregister_window()
+ * when destroying the window.
+ *
+ * Before 3.8 you needed to call gdk_window_set_user_data() directly to set
+ * this up. This is now deprecated and you should use gtk_widget_register_window()
+ * instead. Old code will keep working as is, although some new features like
+ * transparency might not work perfectly.
+ *
+ * Since: 3.8
+ */
+void
+gtk_widget_register_window (GtkWidget    *widget,
+                           GdkWindow    *window)
+{
+  GtkWidgetPrivate *priv;
+  gpointer user_data;
+
+  g_return_if_fail (GTK_IS_WIDGET (widget));
+  g_return_if_fail (GDK_IS_WINDOW (window));
+
+  gdk_window_get_user_data (window, &user_data);
+  g_assert (user_data == NULL);
+
+  priv = widget->priv;
+
+  gdk_window_set_user_data (window, widget);
+  priv->registered_windows = g_list_prepend (priv->registered_windows, window);
+}
+
+/**
+ * gtk_widget_unregister_window:
+ * @widget: a #GtkWidget
+ * @window: a #GdkWindow
+ *
+ * Unregisters a #GdkWindow from the widget that was previously set up with
+ * gtk_widget_register_window(). You need to call this when the window is
+ * no longer used by the widget, such as when you destroy it.
+ *
+ * Since: 3.8
+ */
+void
+gtk_widget_unregister_window (GtkWidget    *widget,
+                             GdkWindow    *window)
+{
+  GtkWidgetPrivate *priv;
+  gpointer user_data;
+
+  g_return_if_fail (GTK_IS_WIDGET (widget));
+  g_return_if_fail (GDK_IS_WINDOW (window));
+
+  priv = widget->priv;
+
+  gdk_window_get_user_data (window, &user_data);
+  g_assert (user_data == widget);
+  gdk_window_set_user_data (window, NULL);
+  priv->registered_windows = g_list_remove (priv->registered_windows, window);
+}
+
 /**
  * gtk_widget_get_window:
  * @widget: a #GtkWidget
index 0f1638f69b710cae426f5c7197d3162addcf702e..ff4f417bc5442fe01b7b50ec7eba00725f945946 100644 (file)
@@ -630,6 +630,12 @@ gboolean              gtk_widget_get_child_visible      (GtkWidget    *widget);
 void                  gtk_widget_set_window             (GtkWidget    *widget,
                                                          GdkWindow    *window);
 GdkWindow           * gtk_widget_get_window             (GtkWidget    *widget);
+GDK_AVAILABLE_IN_3_8
+void                  gtk_widget_register_window        (GtkWidget    *widget,
+                                                         GdkWindow    *window);
+GDK_AVAILABLE_IN_3_8
+void                  gtk_widget_unregister_window      (GtkWidget    *widget,
+                                                         GdkWindow    *window);
 
 int                   gtk_widget_get_allocated_width    (GtkWidget     *widget);
 int                   gtk_widget_get_allocated_height   (GtkWidget     *widget);
index 181ff85454e2e0ebae36cb13bfa96e4a812db136..0ac9d08c2aa3f044d1025dc6f47982bb0b311879 100644 (file)
@@ -136,7 +136,7 @@ gtk_win32_embed_widget_unrealize (GtkWidget *widget)
   
   if (embed_widget->parent_window != NULL)
     {
-      gdk_window_set_user_data (embed_widget->parent_window, NULL);
+      gtk_widget_unregister_window (widget, embed_widget->parent_window);
       g_object_unref (embed_widget->parent_window);
       embed_widget->parent_window = NULL;
     }
@@ -234,7 +234,7 @@ gtk_win32_embed_widget_realize (GtkWidget *widget)
   gdk_window = gdk_window_new (embed_widget->parent_window,
                                &attributes, attributes_mask);
   gtk_widget_set_window (widget, gdk_window);
-  gdk_window_set_user_data (gdk_window, window);
+  gtk_widget_register_window (widget, gdk_window);
 
   embed_widget->old_window_procedure = (gpointer)
     SetWindowLongPtrW(GDK_WINDOW_HWND (gdk_window),
index 098488667fb2a8b172ccd753520a239feadbab4c..6fc82f831174e50c1132b0e3876102223157569f 100644 (file)
@@ -5203,7 +5203,7 @@ gtk_window_realize (GtkWidget *widget)
       gdk_window = gdk_window_new (gtk_widget_get_parent_window (widget),
                                   &attributes, attributes_mask);
       gtk_widget_set_window (widget, gdk_window);
-      gdk_window_set_user_data (gdk_window, widget);
+      gtk_widget_register_window (widget, gdk_window);
 
       gtk_style_context_set_background (gtk_widget_get_style_context (widget), gdk_window);
 
@@ -5286,7 +5286,7 @@ gtk_window_realize (GtkWidget *widget)
 
   gdk_window_enable_synchronized_configure (gdk_window);
 
-  gdk_window_set_user_data (gdk_window, window);
+  gtk_widget_register_window (widget, gdk_window);
 
   context = gtk_widget_get_style_context (widget);
   gtk_style_context_set_background (context, gdk_window);
@@ -5768,7 +5768,7 @@ resize_grip_create_window (GtkWindow *window)
                                       attributes_mask);
   gdk_window_set_background_rgba (priv->grip_window, &transparent);
 
-  gdk_window_set_user_data (priv->grip_window, widget);
+  gtk_widget_register_window (widget, priv->grip_window);
 
   gdk_window_raise (priv->grip_window);
 
@@ -5781,7 +5781,7 @@ resize_grip_destroy_window (GtkWindow *window)
 {
   GtkWindowPrivate *priv = window->priv;
 
-  gdk_window_set_user_data (priv->grip_window, NULL);
+  gtk_widget_unregister_window (GTK_WIDGET (window), priv->grip_window);
   gdk_window_destroy (priv->grip_window);
   priv->grip_window = NULL;
   update_grip_visibility (window);